package com.zb.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zb.entity.*;
import com.zb.extend.CodeExtend;
import com.zb.result.PageUtil;
import com.zb.vo.*;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 编码表 服务类
 * </p>
 *
 * @author WEN
 * @since 2023-08-23
 */
public interface ZjCodeService extends IService<ZjCode> {

    /**
     * 新增编码
     *
     * @param loginInfo     登录信息
     * @param codeVo        创建编码信息
     * @param codeParamInfo 编码参数信息
     * @return
     */
    List<ZjCode> save(AccounLoginInfo loginInfo, CodeVo codeVo, CodeParamInfo codeParamInfo);

    /**
     * 保存工单导入的编码信息
     * @param addCodeList
     * @param updateCodeList
     * @param addCodeInfoList
     * @param updateCodeInfoList
     * @param codeLogList
     */
    void saveOrderExcelImportCode(List<ZjCode> addCodeList, List<ZjCode> updateCodeList, List<ZjCodeInfo> addCodeInfoList, List<ZjCodeInfo> updateCodeInfoList, List<ZjCodeLog> codeLogList);

    /**
     * 根据编码ID更新编码
     * @param tableType 表类型
     * @param code 编码数据
     */
    void updateById(int tableType, ZjCode code);

    /**
     * 查询编码列表
     * @param custAccId 商家ID
     * @param selectVo 查询条件
     * @return
     */
    Map<String, Object> getList(Long custAccId, CodeListSelectVo selectVo);

    /**
     * 查询编码列表数据
     * @param custAccId 商家ID
     * @param selectVo 搜索对象
     * @return
     */
    List<CodeListVo> getListData(Long custAccId, List<Long> goodsIds, CodeListSelectVo selectVo);

    /**
     * 查询编码列表总记录数
     * @param custAccId 商家ID
     * @param selectVo 搜索对象
     * @return
     */
    long getListCount(Long custAccId, List<Long> goodsIds, CodeListSelectVo selectVo);

    /**
     * 批量激活编码
     * @param loginInfo 登录信息
     * @param codeParamVos 编码参数
     */
    void updateBatchActiveByIds(AccounLoginInfo loginInfo, List<CodeParamVo> codeParamVos);

    /**
     * 批量删除编码
     * @param codeParamVos
     */
    void deleteBatchByIds(List<CodeParamVo> codeParamVos);

    /**
     * 更改编码商品信息
     * @param loginInfo
     * @param goodsChangeVo
     */
    void codeGoodsBindingChange(AccounLoginInfo loginInfo, CodeGoodsChangeVo goodsChangeVo);

    /**
     * 根据编码ID获取信息
     * @param id 编码ID
     * @return
     */
    CodeExtend getInfoById(Long id);

    /**
     * 编码登记时更新编码信息
     * @param loginInfo 登录信息
     * @param id 编码ID
     * @param logName 编码日志事件名称
     * @param logContent 编码日志内容
     */
    void updateCodeInfoByRegister(AccounLoginInfo loginInfo, Long id, String logName, String logContent);

    /**
     * 根据编码ID获取表类型
     * @param id 编码ID
     * @return
     */
    Integer getTableTypeById(Long id);

    /**
     * 分页获取批次ID
     * @param custAccId 商家ID
     * @param goodsIds 商品ID集合
     * @param page 当前页码
     * @param limit 每页显示数量
     * @return
     */
    List<Long> pageGetBatchIds(Long custAccId, List<Long> goodsIds, Long page, Long limit);

    /**
     * 根据批次ID查询编码激活数量
     * @param batchIdList 编码批次ID集合
     * @return
     */
    List<CodeBatchListVo> getActivaCountByBatchIds(List<Long> batchIdList);

    /**
     * 根据批次ID获取编码列表
     * @param batchId 批次ID
     * @param pageUtil
     * @return
     */
    Map<String, Object> getCodeList(Long batchId, PageUtil pageUtil);

    /**
     * 根据编码批次ID查询检查是否编码有关联信息
     * @param codeBatchIds
     */
    void checkCodeRelationInfoForDeleteByBatchIds(List<Long> codeBatchIds);

    /**
     * 根据批次编码ID删除相关编码
     * @param batchId
     */
    void deleteByBatchId(Long batchId);

    /**
     * 批量更改编码商品信息
     * @param loginInfo
     * @param goodsUpdateVo
     */
    void updateCodeGoods(AccounLoginInfo loginInfo, CodeBatchGoodsUpdateVo goodsUpdateVo);

    /**
     * 根据编码ID查询检查是否编码有关联信息
     * @param ids
     */
    void checkCodeRelationInfoByIds(List<Long> ids);

    /**
     * 根据编码批次ID获取编码总数量
     * @param batchId
     * @return
     */
    long getCodeBatchExportTotalByBatchId(Long batchId);

    /**
     * 根据批次ID分页获取编码信息
     * @param batchId 批次ID
     * @param page 当面页码
     * @param limit 查询的数量
     * @return
     */
    List<ZjCode> getCodeBatchExportByBatchId(Long batchId, int page, int limit);

    /**
     * 根据商品ID & 商品规格ID查询存在关联的商品ID集合
     * @param type 商品类型：1-成品，2-备件
     * @param goodsId
     * @param goodsSpecIds
     * @return
     */
    List<Long> getGoodsSpecId(Integer type, Long goodsId, List<Long> goodsSpecIds);

    /**
     * 根据商品ID查询存在关联的商品ID集合
     * @param type 商品类型：1-成品，2-备件
     * @param goodsIds
     * @return
     */
    List<Long> getGoodsId(Integer type, List<Long> goodsIds);

    /**
     * 根据ID查询信息
     * @param ids
     * @return
     */
    List<ZjCode> getRegisterByIds(List<Long> ids);

    /**
     * 保存编码登记
     * @param codeDataVo
     */
    void saveCodeRegister(CodeDataVo codeDataVo);

    /**
     * 根据编码ID获取编码信息
     * @param ids
     * @return
     */
    List<ZjCode> getSecurityCodeByIds(List<Long> ids);

    /**
     * 根据编码ID获取批次编码ID
     * @param ids 编码ID
     * @return
     */
    List<ZjCode> getBatchIdByIds(List<Long> ids);

    /**
     * 根据编码批次ID获取编码ID
     * @param batchIds 编码批次ID
     * @return
     */
    List<Long> getIdByBatchIds(List<Long> batchIds);

    /**
     * 根据批次商品表ID获取编码信息
     * @param batchGoodsId 批次商品ID
     * @param page 当前页码
     * @param limit 每页显示数量
     * @return
     */
    List<ZjCode> getByBatchGoodsId(Long batchGoodsId, long page, long limit);

    /**
     * 获取未登记商品编码（成品）
     * @param custAccId 商家ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    List<ZjCode> getNotRegisterCode(Long custAccId, OrderCodeSelectVo codeSelectVo);

    /**
     * 获取未登记商品编码总数量（成品）
     * @param custAccId 商家ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    long getNotRegisterCodeCount(Long custAccId, OrderCodeSelectVo codeSelectVo);

    /**
     * 获取已登记商品编码总数量（成品）
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param goodsIds 商品ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    List<CodeRegisterVo> getRegisterCode(Long custAccId, Long userId, List<Long> goodsIds, OrderCodeSelectVo codeSelectVo);

    /**
     * 获取已登记商品编码总数量总记录数（成品）
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param goodsIds 商品ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    long getRegisterCodeCount(Long custAccId, Long userId, List<Long> goodsIds, OrderCodeSelectVo codeSelectVo);

    /**
     * 根据编码ID获取用户编码登记信息
     * @param ids 编码ID
     * @return
     */
    List<ZjCode> getUserCodeRegisterByIds(List<Long> ids);

    /**
     * 根据编码ID获取用户编码信息
     * @param id 编码ID
     * @return
     */
    ZjCode getUserCodeRegisterById(Long id);

    /**
     * 根据防伪/仓库编码获取编码ID，不支持模糊查询
     * @param code 防伪/仓库编码
     * @return 编码ID
     */
    Long getIdByCodeOrStoreCode(Long custAccId, String code);

    /**
     * 根据编码ID获取商品ID
     * @param id 编码ID
     * @return
     */
    ZjCode getGoodsById(Long id);

    /**
     * 根据编码ID获取商品编码信息
     * @param ids 编码ID
     * @return
     */
    List<ZjCode> getGoodsByIds(List<Long> ids);

    /**
     * 根据防伪编码获取编码信息
     * @param custAccId 商家ID
     * @param securityCode 防伪编码
     * @return
     */
    ZjCode getByCode(Long custAccId, String securityCode);

    /**
     * 根据编码ID获取详情
     * @param id 编码ID
     * @return
     */
    CodeExtend getDetailById(Long id);

    /**
     * 根据编码ID校验并获取存在的编码ID
     * @param codeIds 编码ID
     * @return
     */
    List<ZjCode> checkByCodes(Long custaccId, List<String> codeIds);

    /**
     * 保存出库激活一物一码
     * @param loginInfo 登录信息
     * @param submitType 提交类型:1-保存,2-保存并审核，3-确认出库
     * @param outStoreCodeActiveMode 激活方式
     * @param storeOutboundCode 出库单号
     * @param codeList 编码信息
     */
    void saveOutStoreActiveCode(AccounLoginInfo loginInfo, String submitType, Integer outStoreCodeActiveMode, String storeOutboundCode, Date outboundTime, List<ZjCode> codeList);

    /**
     * 获取在库的一物一码
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    List<ZjCode> getInStoreCodeList(Long custAccId, CodeInStoreListSearchVo searchVo);

    /**
     * 获取在库的一物一码总记录数
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    long getInStoreCodeListCount(Long custAccId, CodeInStoreListSearchVo searchVo);

    /**
     * 更新出库激活的一物一码
     * @param loginInfo 登录信息
     * @param outStore 是否为出库：false-入库，true-出库
     * @param cancelBound 是否取消出/入库单：true-是，false-不是，为驳回操作
     * @param updateCodeList
     */
    void updateOutStoreActiveCode(AccounLoginInfo loginInfo, boolean outStore, boolean cancelBound, List<ZjCode> updateCodeList);

    /**
     * 更新一物一码入库
     * @param loginInfo 登录信息
     * @param submitType 提交类型:1-保存,2-保存并审核，3-确认入库
     * @param storeInboundCode 入库单号
     * @param inboundTime 入库时间
     * @param codeList
     */
    void saveInbound(AccounLoginInfo loginInfo, String submitType, String storeInboundCode, Date inboundTime, List<ZjCode> codeList);

    /**
     * 根据一物一码ID更新
     * @param loginInfo
     * @param outStore 是否为出库：false-入库，true-出库
     * @param boundExcuteType 入库执行类型：1-删除，2-作废，3-驳回
     * @param ids
     */
    void updateInbound(AccounLoginInfo loginInfo, boolean outStore, Integer boundExcuteType, List<Long> ids);

    /**
     * 获取未出入库的一物一码
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    List<ZjCode> getStoreCodeList(Long custAccId, CodeInStoreListSearchVo searchVo);

    /**
     * 获取未出入库的一物一码总记录数
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    long getStoreCodeListCount(Long custAccId, CodeInStoreListSearchVo searchVo);

    /**
     * 确认出入库后更新一物一码
     * @param codeIds 一物一码ID
     * @param sendGoodsTime 出入库时间
     * @param outStore 是否出库：false-入库，true-出库
     */
    void updateCodeByOutInbound(AccounLoginInfo loginInfo, List<Long> codeIds, Date sendGoodsTime, boolean outStore);

    /**
     * 查询一物一码是否重复
     * @param custAccId 商家ID
     * @param securityCode 一物一码
     * @return
     */
    Integer existBySecurityCode(Long custAccId, String securityCode);
}
